#ifndef CLIENTHANDLER_H
#define CLIENTHANDLER_H

#include <QThread>
#include <QTcpSocket>
#include <QJsonObject>
#include "protocol.h"
#include "databasemanager.h"

class ClientHandler : public QThread {
    Q_OBJECT
public:
    explicit ClientHandler(qintptr socketDescriptor, QObject *parent = nullptr);
    ~ClientHandler();
    
    void disconnectFromClient();
    
signals:
    void disconnected(ClientHandler* client);
    
protected:
    void run() override;
    
private slots:
    void onReadyRead();
    void onDisconnected();
    
private:
    void processMessage(MessageType type, const QJsonObject& data);
    void sendResponse(MessageType type, const QJsonObject& data);
    
    // 处理各类请求
    void handleLogin(const QJsonObject& data);
    void handleRegister(const QJsonObject& data);
    void handleGetPatientInfo(const QJsonObject& data);
    void handleUpdatePatientInfo(const QJsonObject& data);
    void handleMakeAppointment(const QJsonObject& data);
    void handleCancelAppointment(const QJsonObject& data);
    void handleGetAppointments(const QJsonObject& data);
    void handleGetAppointmentDetail(const QJsonObject& data);
    void handleGetMedicalRecords(const QJsonObject& data);
    void handleGetPrescriptions(const QJsonObject& data);
    void handleGetDoctorInfo(const QJsonObject& data);
    void handleUpdateDoctorInfo(const QJsonObject& data);
    void handleGetDoctorSchedule(const QJsonObject& data);
    void handleGetPatientList(const QJsonObject& data);
    void handleCreateMedicalRecord(const QJsonObject& data);
    void handleCreatePrescription(const QJsonObject& data);
    void handleCreateExamRequest(const QJsonObject& data);
    void handleGetDepartments(const QJsonObject& data);
    void handleGetDoctorsByDept(const QJsonObject& data);
    void handlePayment(const QJsonObject& data);
    void handleGetPaymentHistory(const QJsonObject& data);
    void handleStartConsultation(const QJsonObject& data);          // 开始接诊
    void handleFinishConsultation(const QJsonObject& data);         // 完成就诊
    void handleCheckAppointmentCompletion(const QJsonObject& data); // 检查预约完成情况
    
    // 医患沟通相关
    void handleGetAllDoctors(const QJsonObject& data);              // 获取所有医生
    void handleGetChatPatients(const QJsonObject& data);            // 获取聊天患者列表
    void handleSendMessage(const QJsonObject& data);                // 发送消息
    void handleGetChatHistory(const QJsonObject& data);             // 获取聊天历史
    void handleGetUnreadCount(const QJsonObject& data);             // 获取未读消息数
    void handleMarkAsRead(const QJsonObject& data);                 // 标记消息为已读
    
    // 通知相关
    void handleGetNotifications(const QJsonObject& data);           // 获取通知列表
    void handleClearAllNotifications(const QJsonObject& data);      // 清空所有通知
    
    // 考勤管理相关
    void handleAttendanceCheckIn(const QJsonObject& data);          // 打卡
    void handleAttendanceCancel(const QJsonObject& data);           // 取消打卡
    void handleGetAttendanceRecords(const QJsonObject& data);       // 获取打卡记录
    void handleGetTodayAttendance(const QJsonObject& data);         // 获取今日打卡状态
    void handleCreateLeaveRequest(const QJsonObject& data);         // 提交请假申请
    void handleCancelLeaveRequest(const QJsonObject& data);         // 取消请假申请
    void handleGetLeaveRequests(const QJsonObject& data);           // 获取请假记录
    void handleCancelLeave(const QJsonObject& data);                // 销假
    void handleGetPopularMedicines(const QJsonObject& data);        // 获取热门药物
    void handleSearchMedicines(const QJsonObject& data);            // 搜索药物
    
    qintptr m_socketDescriptor;
    QTcpSocket* m_socket;
    QByteArray m_buffer;
    int m_currentUserId;
    int m_currentUserRole;
};

#endif // CLIENTHANDLER_H

